home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1997 March / macformat-048.iso / Shareware Plus / Updaters / NewsWatcher 2.15+jp1 folder / patch source CW10 / myTools.c < prev    next >
Encoding:
Text File  |  1996-12-16  |  7.1 KB  |  380 lines  |  [TEXT/CWIE]

  1. // NewsWatcher 2.1 "myTools.c"
  2. // Copyright (C) 1994-1996 Mizutori Tetsuya
  3. // 1994/5/24, 1994/7/15, 1995/2/8, 1995/2/21, 1995/7/14, 1996/2/12, 1996/8/27, 1996/11/24
  4.  
  5. #include "myTools.h"
  6.  
  7. // Global variables
  8.  
  9. //Boolean gOptionPressed = false;        /* true if Option Key is pressed */
  10.  
  11.  
  12. /***** Keyboard sensing *****/
  13. #ifdef COMMENT
  14.  
  15.     Apple Standard keyboard Layout
  16.       Examples:
  17.     Code    Legend
  18.     0x00    A
  19.     0x01    S
  20.     0x06    Z
  21.     0x24    Return
  22.     0x30    Tab
  23.     0x31    Space
  24.     0x33    Delete
  25.     0x35    Escape
  26.  
  27. #endif /* COMMENT */
  28.  
  29.  
  30. static Boolean
  31. IsPressed(
  32.     unsigned short    k )    //    k =    keyboard scan code (0-127 or modifier keys)
  33. {
  34.     unsigned char    km[16];
  35.  
  36.     switch ( k ) {
  37.         case cmdKey:        k = 0x37; break;
  38.         case shiftKey:        k = 0x38; break;
  39.         case alphaLock:        k = 0x39; break;
  40.         case optionKey:        k = 0x3A; break;
  41.         case controlKey:    k = 0x3B; break;
  42.         default:            break;
  43.     }
  44.  
  45.     GetKeys( (void *) km );
  46.  
  47.     return  ( ( ( km[k>>3] >> (k & 7) ) ) & 1 != 0 );
  48. }
  49.  
  50.  
  51. /**** Kanji code conversion *****/
  52. #ifdef COMMENT
  53.  
  54.     Kanji code conversion
  55.     Added by Mizutori Tetsuya, 1994/5/24
  56.     JIS Sequence
  57.     Kanji-in:    ESC + '$' + { 'B', '@', '(B' }
  58.     Kanji-out:    ESC + '(' + { 'J', 'B', 'H' }
  59.  
  60. #endif /* COMMENT */
  61.  
  62. #define IN(x,a,b) (((a) <= (x)) && ((x) <= (b)))
  63.  
  64.  
  65. /**** Kanji code check routines *****/
  66.  
  67. Boolean
  68. IsJISKanji(
  69.     const char *        p,
  70.     const char *        pEnd )
  71. {
  72.     const unsigned char    c1    = * p;
  73.     const unsigned char    c2    = * (p+1);
  74.  
  75.     if ( pEnd < p+2 ) return false;
  76.  
  77.     if ( ! IN(c1,0x21,0x7E) ) return false;
  78.     if ( ! IN(c2,0x21,0x7E) ) return false;
  79.  
  80.     return true;
  81. }
  82.  
  83.  
  84. Boolean
  85. IsMSKanji(
  86.     const char *        p,
  87.     const char *        pEnd )
  88. {
  89.     const unsigned char    c1    = * p;
  90.     const unsigned char    c2    = * (p+1);
  91.  
  92.     if ( pEnd < p+2 ) return false;
  93.  
  94.     if ( ! IN(c1,0x81,0x9E) && ! IN(c1,0xE0,0xEC) ) return false;
  95.     if ( ! IN(c2,0x40,0x7E) && ! IN(c2,0x80,0xFC) ) return false;
  96.  
  97.     return true;
  98. }
  99.  
  100.  
  101. Boolean
  102. IsEUCKanji(
  103.     const char *        p,
  104.     const char *        pEnd )
  105. {
  106.     const unsigned char    c1    = * p;
  107.     const unsigned char    c2    = * (p+1);
  108.  
  109.     if ( pEnd < p+2 ) return false;
  110.  
  111.     if ( ( c1 & 0x80 ) == 0 ) return false;
  112.     if ( ( c2 & 0x80 ) == 0 ) return false;
  113.  
  114.     return true;
  115. }
  116.  
  117.  
  118.  
  119. Boolean
  120. IsKanji(
  121.     const char *        p,
  122.     const char *        pStart,
  123.     const char *        pEnd )
  124. {
  125.     if ( p < pStart ) return false;
  126.     if ( pEnd < p+2 ) return false;
  127.  
  128.     return IsMSKanji( p, pEnd );
  129. }
  130.  
  131.  
  132. /***** Kanji code conversion *****/
  133.  
  134. void
  135. EUCKanji2JIS(
  136.     const char *    p,
  137.     char *            q )
  138. {
  139.     unsigned char    c1    = * p;
  140.     unsigned char    c2    = * (p+1);
  141.  
  142.     *q        = c1 & (unsigned char) 0x7F;
  143.     *(q+1)    = c2 & (unsigned char) 0x7F;
  144. }
  145.  
  146.  
  147. void
  148. JIS2EUCKanji(
  149.     const char *    p,
  150.     char *            q )
  151. {
  152.     unsigned char    c1    = * p;
  153.     unsigned char    c2    = * (p+1);
  154.  
  155.     *q        = c1 | (unsigned char) 0x80;
  156.     *(q+1)    = c2 | (unsigned char) 0x80;
  157. }
  158.  
  159.  
  160. void
  161. MSKanji2JIS(
  162.     const char *    p,
  163.     char *            q )
  164. {
  165.     unsigned short    d1    = * (unsigned char *) p;
  166.     unsigned short    d2    = * (unsigned char *) (p+1);
  167.  
  168.     unsigned short    x1;
  169.     unsigned short    x2;
  170.  
  171.     x1 = d1 + d1 - ((d1 <= 0x009F) ? 0x00E1 : 0x0161);
  172.     if ( d2 < 0x009F ) x2 = d2 - ((d2 > 0x007F) ? 0x0020 : 0x001F);
  173.     else { x2 = d2 - 0x007E; x1 += 1; }
  174.  
  175.     *q        = x1;
  176.     *(q+1)    = x2;
  177. }
  178.  
  179.  
  180. void
  181. JIS2MSKanji(
  182.     const char *    p,
  183.     char *            q )
  184. {
  185.     unsigned short    d1    = * (unsigned char *) p;
  186.     unsigned short    d2    = * (unsigned char *) (p+1);
  187.  
  188.     unsigned short    x1;
  189.     unsigned short    x2;
  190.  
  191.     x1 = ((d1-1)>>1) + ((d1 <= 0x005E) ? 0x0071 : 0x00B1);
  192.     x2 = d2 + ((d1 & 1) ? ((d2 < 0x0060) ? 0x001F : 0x0020) : 0x007E);
  193.  
  194.     *q        = x1;
  195.     *(q+1)    = x2;
  196. }
  197.  
  198.  
  199. /***** Skip punctuations or braces following to Kanji string *****/
  200.  
  201. long
  202. SkipOnBrace (
  203.     const char *        p,
  204.     const char *        pStart,
  205.     const char *        pEnd )
  206. {
  207.     long                    skipCount;
  208.     unsigned char            cp;
  209.     const unsigned char    *    q;
  210.     const unsigned char        romanBraces[16] = ".,;:?!)]}>-\0";
  211.     const unsigned char        kanjiBraces[64] = {
  212.         0xff,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
  213.         0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0xff,0xff,
  214.         0x60,0xff,0xff,0x63,0x64,0xff,0x66,0xff,0x68,0xff,0x6a,0xff,0x6c,0xff,0x6e,0xff,
  215.         0x70,0xff,0x72,0xff,0x74,0xff,0x76,0xff,0x78,0xff,0x7a,0xff,0xff,0xff,0xff,0x00,
  216.         };
  217.     //    The items of kanjiBraces[] may be assigned in a random order.
  218.     //    You are allowed to eliminate the items whose value is 0xff.
  219.     //    kanjiBraces[] array must have its last item as '\0'.
  220.     //    So, you can also define: kanjiBraces[] = "ABCD...XYZ[\\]`cdfhjlnprtvxz"
  221.     //    kanjiBraces[] includes punctuations and right braces in [0x8140 .. 0x817E]
  222.     //    which follow the Kanji strings.
  223.     //            0 1 2 3 4 5 6 7 8 9 A B C D E F
  224.     //    0x8140:    Å@ÅAÅBÅCÅDÅEÅFÅGÅHÅIÅJÅKÅLÅMÅNÅO    0x40:-123456789ABCDEF
  225.     //    0x8150:    ÅPÅQÅRÅSÅTÅUÅVÅWÅXÅYÅZÅ[Å\Å]Å^Å_    0x50:0123456789ABCD--
  226.     //    0x8160:    Å`ÅaÅbÅcÅdÅeÅfÅgÅhÅiÅjÅkÅlÅmÅnÅo    0x60:0--34-6-8-A-C-E-
  227.     //    0x8170:    ÅpÅqÅrÅsÅtÅuÅvÅwÅxÅyÅzÅ{Å|Å}Å~**    0x70:0-2-4-6-8-A----*
  228.     //    Sorry, these 2-byte characters are shown properly in Kanji font.
  229.  
  230. //    if ( IsPressed(optionKey) || IsPressed(shiftKey) )  return 0;
  231.  
  232.     if ( p < pStart )  return 0;
  233.     if ( pEnd <= p  )  return 0;
  234.  
  235.     if ( IsKanji(p,pStart,pEnd) ) {
  236.         if ( *p != (char) 0x81 )  return 0;
  237.         cp = *(p+1);
  238.         q = kanjiBraces;
  239.         skipCount = 2;
  240.     } else {
  241.         cp = *p;
  242.         q = romanBraces;
  243.         skipCount = 1;
  244.     }
  245.  
  246.     while ( *q != '\0' ) {
  247.         if ( cp == *q )  return skipCount;
  248.         q++;
  249.     }
  250.  
  251.     return 0;
  252. }
  253.  
  254.  
  255. /**** Memory routines *****/
  256. #include "memutil.h"
  257.  
  258. OSErr
  259. MyResizeHandle(
  260.     void *        handle,
  261.     Size        len )
  262. {
  263.     char hState;
  264. //    Size oldLen;
  265.     OSErr err;
  266.  
  267. //    oldLen = GetHandleSize(handle);
  268.  
  269.     hState = MyHGetState(handle);
  270.     MyHUnlock(handle);
  271.  
  272.     err = MySetHandleSize(handle, len);
  273.  
  274.     MyHSetState(handle, hState);
  275.  
  276.     return err;
  277. }
  278.  
  279.  
  280. /***** Resource Handling *****/
  281. long    gFillColumn = 74;
  282.  
  283. #define kFillColumnID        800
  284. #define    iTextBox            4
  285.  
  286. #define    kMoveToFront        (WindowPtr)-1L
  287. #define    kNilFilterProc        nil
  288.  
  289. long
  290. GetFillColumn( void )
  291. {
  292.     DialogPtr    dialog;
  293.     long        data;
  294.  
  295. //    data = ( gFillColumn > 0 ? gFillColumn : 74 );
  296.     data = gFillColumn;
  297.  
  298.     if ( ! IsPressed( optionKey ) )  return data;
  299.  
  300.     dialog = GetNewDialog( kFillColumnID, nil, kMoveToFront );
  301.     if ( dialog != nil ) {
  302.         short    item;
  303.         short    iType;
  304.         Handle    iHndl;
  305.         Rect    iRect;
  306.         Str255    text;
  307.         OSErr    err;
  308.  
  309.         GetDialogItem( dialog, iTextBox, &iType, &iHndl, &iRect );
  310.  
  311.         NumToString( data, text );
  312.         SetDialogItemText( iHndl, text );
  313.         SelectDialogItemText( dialog, iTextBox, 0, 32767 );
  314.  
  315. //        ParamText( prompt, "\p", "\p", "\p" );
  316.  
  317.         err = SetDialogDefaultItem( dialog, ok );
  318.         err = SetDialogCancelItem( dialog, cancel );
  319.         err = SetDialogTracksCursor( dialog, true );
  320.  
  321.         ShowWindow( dialog );
  322.  
  323.         do {
  324.             ModalDialog( kNilFilterProc, &item );
  325.         } while ( item != ok && item != cancel );
  326.  
  327.         GetDialogItemText( iHndl, text );
  328.  
  329.         DisposeDialog( dialog );
  330.  
  331.         if ( item == ok )  StringToNum( text, &data );
  332.     }
  333.  
  334.     if ( data < 10 )  data = 10;
  335.  
  336.     gFillColumn = data;
  337.  
  338.     return data;
  339. }
  340.  
  341.  
  342. #ifdef COMMENT
  343. long GetFillColumn ( void )
  344. {
  345.     StringHandle    theHndl;
  346.     long            data = 0;
  347.  
  348.     theHndl = GetString( kFillColumnID );
  349.  
  350.     if ( theHndl != nil ) {
  351.         StringToNum( *theHndl, &data );
  352.         DisposeHandle( (Handle) theHndl );
  353.     }
  354.  
  355.     if ( data < 10 )  data = 10;
  356.  
  357.     return data;
  358. }
  359. #endif /* COMMENT */
  360.  
  361.  
  362. #define kFillMessageID        801
  363. Boolean
  364. KillCustomMessageID( void )
  365. {
  366.     StringHandle    theHndl;
  367.     long            data = 0;
  368.  
  369.     theHndl = GetString( kFillMessageID );
  370.  
  371.     if ( theHndl != nil ) {
  372.         StringToNum( *theHndl, &data );
  373.         //ReleaseResource( (Handle) theHndl );
  374.     }
  375.  
  376.     return ( data != 0 );
  377. }
  378.  
  379. // end of program
  380.